package com.cl.dao;

import java.lang.reflect.ParameterizedType;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.session.RowBounds;
import org.apache.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;

import com.cl.util.Pager;



/**
 * 基础dao实现类
 * 创建者:chenlu
 * 创建时间:2016-6-30
 * 
 */
public class BaseDaoImpl<T> implements BaseDao<T>{
	private Logger logger =Logger.getLogger(BaseDaoImpl.class);

	@Resource
	protected SqlSessionTemplate sqlSessionTemplate;
	
	
	@SuppressWarnings("rawtypes")
	protected Class type;
    
	protected BaseDaoImpl(){
        this.type = this.getDAOClass(); 
    }
    
    @SuppressWarnings("all")
    protected Class getDAOClass(){
         Class clazz = (Class)((ParameterizedType) this.getClass().getGenericSuperclass())
            .getActualTypeArguments()[0];
         return clazz;
    }
    protected String getMethodPath(String methodType){
        String str = type.getName() + "." + methodType;
        return str;
    }
    
	/**
	 * 根据ID查询一条数据
	 * @param id 参数ID
	 * @return 找到则返回，否则返回空
	 */
	public T getOneDataByID(Object id) {
		logger.info("新增数据开始        "+getMethodPath("getOneDataByID"));
		return sqlSessionTemplate.selectOne(getMethodPath("getOneDataByID"), id);
	}
	

	/**
	 * 新增数据
	 * @param t 新增的对象
	 * @return 返回新增的记录数据
	 */
	public int addOneData(T t) {
		logger.info("查询一条数据开始        "+getMethodPath("addOneData"));
		return sqlSessionTemplate.insert(getMethodPath("addOneData"), t);
	}


	/**
	 * 根据主键删除一条数据
	 * @param id 
	 * @return 删除的记录数
	 */
	public int deleteOneDataById(Object id) {
		logger.info("删除一条数据开始        "+getMethodPath("deleteOneDataById"));
		return sqlSessionTemplate.delete(getMethodPath("deleteOneDataById"), id);
	}
	
	/**
	 * 根据条件删除数据
	 * @param map
	 * @return  删除的记录数
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public int deleteDataByParams(Map map) {
		logger.info("根据条件删除数据开始        "+getMethodPath("deleteDataByParams"));
		return sqlSessionTemplate.delete(getMethodPath("deleteDataByParams"), map);
	}

	/**
	 * 根据主键更新一条数据
	 * @param id
	 * @return 更新的记录数
	*/
	public int updateDataById(Object id) {
		logger.info("更新一条数据开始        "+getMethodPath("updateDataById"));
		return sqlSessionTemplate.update(getMethodPath("updateDataById"), id);
	} 

	/**
	 * 根据自定义的参数更新多条数据
	 * @param map
	 * @return  更新的记录数
	 */
	@SuppressWarnings("rawtypes")
	public int updateDataByParams(Map map) {
		logger.info("更新多条数据开始        "+getMethodPath("updateDataByParams"));
		return sqlSessionTemplate.update(getMethodPath("updateDataByParams"), map);
	}
	
	/**
	 * 根据实体直接修改
	 * @param map
	 * @return  更新的记录数
	 */
	public int updateDataByObject(T t) {
		logger.info("更新多条数据开始        "+getMethodPath("updateDataByObject"));
		return sqlSessionTemplate.update(getMethodPath("updateDataByObject"), t);
	}
	
	/**
	 * 根据自定义的参数查询实体列表
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public List<T> listDataByParams(Map map) {
		return sqlSessionTemplate.selectList(getMethodPath("listDataByParams"), map);
	}

	/**
	 * mysql分页
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	public Pager pageList(String sqlID, Map map, Pager page) {
		RowBounds rowbounds = new RowBounds((page.getPage()-1)*page.getPageSize(), page.getPageSize());
		int rowCount = sqlSessionTemplate.selectOne(getMethodPath(sqlID+"Count"), map);
		List pagelist =   sqlSessionTemplate.selectList(getMethodPath(sqlID), map,  rowbounds);
		page.setList((pagelist == null) ? new ArrayList() : pagelist);
		page.setTotleCount(rowCount);
		page.setPages(Pager.getPages(rowCount, page.getPageSize()));
		return page;
	}

}

